﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sinacor.Infra.Common.Exceptions.FaultContracts;

namespace Sinacor.Infra.Common.Exceptions
{
    /// <summary>
    /// Exceção base para exceções com número do erro
    /// </summary>
    public abstract class BaseErrorNumberException : BaseLogException
    {
        /// <summary>
        /// Construtor que inicializa ErrorNumber
        /// </summary>
        /// <param name="errorNumber">Número do erro</param>
        public BaseErrorNumberException(int errorNumber)
            : this(errorNumber, null, null)
        {
        }

        /// <summary>
        /// Construtor que inicializa ErrorNumber e InnerException
        /// </summary>
        /// <param name="errorNumber">Número do erro</param>
        /// <param name="innerException">Erro que originou a Exception</param>
        public BaseErrorNumberException(int errorNumber, Exception innerException)
            : this(errorNumber, null, innerException)
        {
        }

        /// <summary>
        /// Construtor que inicializa ErrorNumber, Message e InnerException
        /// </summary>
        /// <param name="errorNumber">Número do erro</param>
        /// <param name="message">Mensagem de erro</param>
        /// <param name="innerException">Erro que originou a Exception</param>
        public BaseErrorNumberException(int errorNumber, string message, Exception innerException)
            : base(message, innerException)
        {
            _errorNumber = errorNumber;
            _message = message;
        }

        private int _errorNumber;
        /// <summary>
        /// Número do erro
        /// </summary>
        public int ErrorNumber
        {
            get { return _errorNumber; }
            protected set { _errorNumber = value; }
        }

        private string _message;
        /// <summary>
        /// Mensagem de erro
        /// </summary>
        public override string Message
        {
            get
            {
                return _message;
            }
        }

        private string _resourceKey;
        /// <summary>
        /// Resource key da mensagem de erro
        /// </summary>
        public string ResourceKey
        {
            get { return _resourceKey; }
            set { _resourceKey = value; }
        }

        /// <summary>
        /// Cria uma falta a partir da exceção
        /// </summary>
        /// <returns>Falta com o erro</returns>
        public override BaseFault CreateFault()
        {
            BaseErrorNumberFault fault = (BaseErrorNumberFault)base.CreateFault();

            fault.ErrorNumber = this.ErrorNumber;
            fault.ResourceKey = this.ResourceKey;

            return fault;
        }

        /// <summary>
        /// Configura a mensagem de erro
        /// </summary>
        /// <param name="message">Mensagem de erro</param>
        public void ConfigureMessage(string message)
        {
            _message = string.Format("{0} - {1}", this.ErrorNumber, message);
        }
    }
}
